#ifndef GDL_WINDOW_H
# define GDL_WINDOW_H

# include <string>

namespace	gdl
{
	////////////////////////////////////////////////////////////
	/// Forward declarations.
	////////////////////////////////////////////////////////////
	class WindowImpl;
	class InputImpl;
	class TextImpl;

	////////////////////////////////////////////////////////////
	///The Window class offert you an OpenGL context.
	////////////////////////////////////////////////////////////
	class	Window
	{
	public:
		////////////////////////////////////////////////////////////
		/// Construct Window object with default values.\n
		/// Title		: "Game"\n
		/// Width		: 800\n
		/// Height		: 600\n
		/// Fullscreen mode	: false\n
		////////////////////////////////////////////////////////////
		Window(void);

		////////////////////////////////////////////////////////////
		/// Destroy Window object.
		////////////////////////////////////////////////////////////
		~Window(void);

		////////////////////////////////////////////////////////////
		/// Create (or recreate) the Window.
		////////////////////////////////////////////////////////////
		void		create(void);

		////////////////////////////////////////////////////////////
		/// Catch the event when the user closes the window.
		////////////////////////////////////////////////////////////
		void		catchEvent(void);

		////////////////////////////////////////////////////////////
		/// Display the window on screen.
		////////////////////////////////////////////////////////////
		void		display(void);

		////////////////////////////////////////////////////////////
		/// Close the window
		////////////////////////////////////////////////////////////
		void		close(void);

		////////////////////////////////////////////////////////////
		/// Tell if the window is open.
		///
		/// \return If the window is open, true is returned.
		/// Otherwise, false is returned.
		////////////////////////////////////////////////////////////
		bool		isOpened(void);

		////////////////////////////////////////////////////////////
		/// Set the title to the window.
		/// Must be called before create method.
		///
		/// \param[in] title New title.
		////////////////////////////////////////////////////////////
		void		setTitle(std::string const & title);

		////////////////////////////////////////////////////////////
		/// Set the width to the window.
		/// Must be called before create method.
		///
		/// \param[in] width New width.
		////////////////////////////////////////////////////////////
		void		setWidth(size_t const width);

		////////////////////////////////////////////////////////////
		/// Set the height to the window.
		/// Must be called before create method.
		///
		/// \param height New height.
		////////////////////////////////////////////////////////////
		void		setHeight(size_t const height);

		////////////////////////////////////////////////////////////
		///Get the Windows's Width
		///
		////////////////////////////////////////////////////////////
		size_t		getWidth()		const;

		////////////////////////////////////////////////////////////
		///Get the Windows's Height
		///
		////////////////////////////////////////////////////////////
		size_t		getHeight()		const;



		////////////////////////////////////////////////////////////
		/// Set the fullscreen mode to the window.
		///
		/// \param[in] state True to set the fullscreen mode.
		/// False to set windowed mode.
		////////////////////////////////////////////////////////////
		void		setFullscreen(bool const state);

		////////////////////////////////////////////////////////////
		/// Set the cursor at a specified position.
		///
		/// \param[in] x Position on x-axis (from left)
		/// \param[in] y Position on y-axis (from top)
		////////////////////////////////////////////////////////////
		void		setCursorAt(unsigned int const x, unsigned int const y);

		////////////////////////////////////////////////////////////
		/// Show or hide the mouse cursor.
		///
		/// \param[in] status True to show the cursor.
		/// False to hide it.
		////////////////////////////////////////////////////////////
		void		showCursor(bool const status);

		////////////////////////////////////////////////////////////
		/// To reach private members of InputImpl and TextImpl
		////////////////////////////////////////////////////////////
		friend class InputImpl;
		friend class TextImpl;

	private:
		////////////////////////////////////////////////////////////
		/// Window implementation
		////////////////////////////////////////////////////////////
		WindowImpl&	window_;

	};
}

#endif /* !GDL_WINDOW_H */
